
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>【Prometheus】 Prometheus 入门到实战搭建监控系统</title>
            </head>
            <body>
            <a href="https://andyoung.blog.csdn.net">原作者博客</a>
            <div id="content_views" class="markdown_views prism-atom-one-light">
                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                    </svg>
                    <p><img src="https://i-blog.csdnimg.cn/blog_migrate/3a5b74ef6871839951ce0a17ffbf76a2.png#pic_center" alt="Prometheus 入门到实战搭建监控系统"></p> 
<p>Prometheus （普罗米修斯）是一款基于时序数据库的开源监控告警系统，说起 Prometheus 则不得不提 SoundCloud，这是一个在线音乐分享的平台，类似于做视频分享的 YouTube，由于他们在微服务架构的道路上越走越远，出现了成百上千的服务，使用传统的监控系统 StatsD 和 Graphite 存在大量的局限性。</p> 
<p>于是他们在 2012 年开始着手开发一套全新的监控系统。Prometheus 的原作者是 Matt T. Proud，他也是在 2012 年加入 SoundCloud 的，实际上，在加入 SoundCloud 之前，Matt 一直就职于 Google，他从 Google 的集群管理器 Borg 和它的监控系统 Borgmon 中获取灵感，开发了开源的监控系统 Prometheus，和 Google 的很多项目一样，使用的编程语言是 Go。</p> 
<p>很显然，Prometheus 作为一个微服务架构监控系统的解决方案，它和容器也脱不开关系。早在 2006 年 8 月 9 日，Eric Schmidt 在搜索引擎大会上首次提出了云计算（Cloud Computing）的概念，在之后的十几年里，云计算的发展势如破竹。</p> 
<p>在 2013 年，Pivotal 的 Matt Stine 又提出了云原生（Cloud Native）的概念，云原生由微服务架构、DevOps 和以容器为代表的敏捷基础架构组成，帮助企业快速、持续、可靠、规模化地交付软件。</p> 
<p>为了统一云计算接口和相关标准，2015 年 7 月，隶属于 Linux 基金会的 云原生计算基金会（CNCF，Cloud Native Computing Foundation） 应运而生。第一个加入 CNCF 的项目是 Google 的 Kubernetes，而 Prometheus 是第二个加入的（2016 年）。</p> 
<p>目前 Prometheus 已经广泛用于 Kubernetes 集群的监控系统中，对 Prometheus 的历史感兴趣的同学可以看看 SoundCloud 的工程师 Tobias Schmidt 在 2016 年的 PromCon 大会上的演讲：The History of Prometheus at SoundCloud 。</p> 
<h3><a id="1_Prometheus__14"></a>1 Prometheus 概述</h3> 
<p>我们在 SoundCloud 的官方博客中可以找到一篇关于他们为什么需要新开发一个监控系统的文章 Prometheus: Monitoring at SoundCloud，在这篇文章中，他们介绍到，他们需要的监控系统必须满足下面四个特性：</p> 
<ul><li>A multi-dimensional data model, so that data can be sliced and diced at will, along dimensions like instance, service, endpoint, and method.</li><li>Operational simplicity, so that you can spin up a monitoring server where and when you want, even on your local workstation, without setting up a distributed storage backend or reconfiguring the world.</li><li>Scalable data collection and decentralized architecture, so that you can reliably monitor the many instances of your services, and independent teams can set up independent monitoring servers.</li><li>Finally, a powerful query language that leverages the data model for meaningful alerting (including easy silencing) and graphing (for dashboards and for ad-hoc exploration).</li></ul> 
<p>简单来说，就是下面四个特性：</p> 
<ul><li>多维度数据模型</li><li>方便的部署和维护</li><li>灵活的数据采集</li><li>强大的查询语言</li></ul> 
<p>实际上，多维度数据模型和强大的查询语言这两个特性，正是时序数据库所要求的，所以 Prometheus 不仅仅是一个监控系统，同时也是一个时序数据库。那为什么 Prometheus 不直接使用现有的时序数据库作为后端存储呢？这是因为 SoundCloud 不仅希望他们的监控系统有着时序数据库的特点，而且还需要部署和维护非常方便。</p> 
<p>纵观比较流行的时序数据库（参见下面的附录），他们要么组件太多，要么外部依赖繁重，比如：Druid 有 Historical、MiddleManager、Broker、Coordinator、Overlord、Router 一堆的组件，而且还依赖于 ZooKeeper、Deep storage（HDFS 或 S3 等），Metadata store（PostgreSQL 或 MySQL），部署和维护起来成本非常高。而 Prometheus 采用去中心化架构，可以独立部署，不依赖于外部的分布式存储，你可以在几分钟的时间里就可以搭建出一套监控系统。</p> 
<p>此外，Prometheus 数据采集方式也非常灵活。要采集目标的监控数据，首先需要在目标处安装数据采集组件，这被称之为 Exporter，它会在目标处收集监控数据，并暴露出一个 HTTP 接口供 Prometheus 查询，Prometheus 通过 Pull 的方式来采集数据，这和传统的 Push 模式不同。</p> 
<p>不过 Prometheus 也提供了一种方式来支持 Push 模式，你可以将你的数据推送到 Push Gateway，Prometheus 通过 Pull 的方式从 Push Gateway 获取数据。目前的 Exporter 已经可以采集绝大多数的第三方数据，比如 Docker、HAProxy、StatsD、JMX 等等，官网有一份 Exporter 的列表。</p> 
<p>除了这四大特性，随着 Prometheus 的不断发展，开始支持越来越多的高级特性，比如：服务发现，更丰富的图表展示，使用外部存储，强大的告警规则和多样的通知方式。</p> 
<p>下图是 Prometheus 的整体架构图:</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/ceb9618692094e13f486ff452493b2ec.png" alt="img"></p> 
<p>从上图可以看出，Prometheus 生态系统包含了几个关键的组件：Prometheus server、Pushgateway、Alertmanager、Web UI 等，但是大多数组件都不是必需的，其中最核心的组件当然是 Prometheus server，它负责收集和存储指标数据，支持表达式查询，和告警的生成。</p> 
<p>我理解它主要分为三个部分：采集层、数据处理层、数据查询层</p> 
<p><strong>采集层</strong></p> 
<p>数据的采集之前，首先需要解决的是采集目标是怎样知道的，Prometheus 提供了比较丰富的采集目标发现机制，比如基于配置文件的发现机制，基于 Kubernetes 的发现机制等等。对于数据采集的方式，主要分为两种方式，一种是 exporter 的 pull 机制，是指应用本身暴露能获取监控指标能力的接口，或者特定能采集应用数据的 exporter，然后 Prometheus server 通过访问 exporter 获取到监控数据信息，这种方式是主流的使用方式，也就是 pull 模式。另一种是通过 Push Gateway 的 push 机制，是用户主动将数据推送到 Push Gateway 组件，然后 Prometheus server 通过 Push Gateway 获取到数据，这种是比较传统的 push 模式。</p> 
<p><strong>数据处理层</strong></p> 
<p>数据处理层主要是指 Prometheus server 本身，主要分为三个部分，Retrieval 负责定时去暴露监控指标的目标上抓取数据，Storage 负责将数据写入磁盘，promQL 暴露查询数据的 http server 能力。同时他也会根据告警规则，一旦达到阈值，那么就会向 Alertmanager 推送告警信息，然后由 Alertmanager 对接到外部平台，将应用异常信息推送给用户。</p> 
<p><strong>数据查询层</strong></p> 
<p>数据查询层是指，可以通过 Prometheus UI 访问 Prometheus server 能力。或者结合 Grafana，将 Prometheus 作为数据源接入，在 Grafana 自定义模版，以图表的方式展示应用指标的状态变化，以便于更加直观地观测应用的变化。</p> 
<h3><a id="2_Prometheus_Server_64"></a><strong>2. 安装Prometheus Server</strong></h3> 
<p>Prometheus基于Golang编写，编译后的软件包，不依赖于任何的第三方依赖。用户只需要下载对应平台的二进制包，解压并且添加基本的配置即可正常启动Prometheus Server。</p> 
<h4><a id="_68"></a><strong>从二进制包安装</strong></h4> 
<p>对于非Docker用户，可以从<a href="https://prometheus.io/download/" rel="nofollow">https://prometheus.io/download/</a> 找到最新版本的Prometheus Sevrer软件包：</p> 
<pre><code class="prism language-text">export VERSION=2.32.1
curl -LO  https://github.com/prometheus/prometheus/releases/download/v$VERSION/prometheus-$VERSION.darwin-amd64.tar.gz
</code></pre> 
<p>解压，并将Prometheus相关的命令，添加到系统环境变量路径即可：</p> 
<pre><code class="prism language-text">tar -xzf prometheus-${VERSION}.darwin-amd64.tar.gz


cd prometheus-${VERSION}.darwin-amd64
</code></pre> 
<p>解压后当前目录会包含默认的Prometheus配置文件promethes.yml:</p> 
<pre><code class="prism language-text"># my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=&lt;job_name&gt;` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']
</code></pre> 
<p>Promtheus作为一个时间序列数据库，其采集的数据会以文件的形式存储在本地中，默认的存储路径为<code>data/</code>，因此我们需要先手动创建该目录：</p> 
<pre><code class="prism language-text">mkdir -p data
</code></pre> 
<p>用户也可以通过参数<code>--storage.tsdb.path="data/"</code>修改本地数据存储的路径，还可以通过参数<code>--config.file=prometheus.yml</code>修改配置文件路径。</p> 
<p>启动prometheus服务，其会默认加载当前路径下的prometheus.yaml文件：</p> 
<pre><code class="prism language-text">./prometheus
</code></pre> 
<p>创建Systemd服务</p> 
<pre><code>vi /usr/lib/systemd/system/prometheus.service
</code></pre> 
<pre><code>[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/opt/prometheus-2.28.0
ExecStart=/opt/prometheus-2.28.0/prometheus \
--web.listen-address=localhost:9090 \
--storage.tsdb.path="/mnt/data/prometheus" \
--config.file=prometheus.yml
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
</code></pre> 
<p>正常的情况下，你可以看到以下输出内容：</p> 
<pre><code class="prism language-text">level=info ts=2021-12-23T14:55:14.499484Z caller=main.go:554 msg="Starting TSDB ..."
level=info ts=2021-12-23T14:55:14.499531Z caller=web.go:397 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2021-12-23T14:55:14.507999Z caller=main.go:564 msg="TSDB started"
level=info ts=2021-12-23T14:55:14.508068Z caller=main.go:624 msg="Loading configuration file" filename=prometheus.yml
level=info ts=2021-12-23T14:55:14.509509Z caller=main.go:650 msg="Completed loading of configuration file" filename=prometheus.yml
level=info ts=2021-12-23T14:55:14.509537Z caller=main.go:523 msg="Server is ready to receive web requests."
</code></pre> 
<h4><a id="_178"></a><strong>使用容器安装</strong></h4> 
<p>对于Docker用户，直接使用Prometheus的镜像即可启动Prometheus Server：</p> 
<pre><code class="prism language-text">docker run -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
</code></pre> 
<p>启动完成后，可以通过http://localhost:9090 访问Prometheus的UI界面：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/b05ae05280608804caa4df20b7984804.png" alt="img"></p> 
<h3><a id="3_Node_Exporter_192"></a><strong>3. 使用Node Exporter采集主机数据</strong></h3> 
<h4><a id="31_Node_Exporter_196"></a><strong>3.1 安装Node Exporter</strong></h4> 
<p>在Prometheus的架构设计中，Prometheus Server并不直接服务监控特定的目标，其主要任务负责数据的收集，存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西，如主机的CPU使用率，我们需要使用到Exporter。Prometheus周期性的从Exporter暴露的HTTP服务地址（通常是/metrics）拉取监控样本数据。</p> 
<p>从上面的描述中可以看出Exporter可以是一个相对开放的概念，其可以是一个独立运行的程序独立于监控目标以外，也可以是直接内置在监控目标中。只要能够向Prometheus提供标准格式的监控样本数据即可。</p> 
<p>这里为了能够采集到主机的运行指标如CPU, 内存，磁盘等信息。我们可以使用<a href="https://github.com/prometheus/node_exporter">Node Exporter</a>。</p> 
<p>Node Exporter同样采用Golang编写，并且不存在任何的第三方依赖，只需要下载，解压即可运行。可以从<a href="https://prometheus.io/download/" rel="nofollow">https://prometheus.io/download/</a>获取最新的node exporter版本的二进制包。</p> 
<p><a href="https://github.com/prometheus/node_exporter/releases/">https://github.com/prometheus/node_exporter/releases/</a></p> 
<pre><code class="prism language-text">curl -OL https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.darwin-amd64.tar.gz
tar -xzf node_exporter-1.3.1.darwin-amd64.tar.gz
</code></pre> 
<h4><a id="32_node_exporter_213"></a>3.2 <strong>运行node exporter:</strong></h4> 
<pre><code class="prism language-text">cp node_exporter-1.3.1.darwin-amd64/node_exporter /usr/local/bin/node_exporter
# 指定端口启动
node_exporter --web.listen-address=":9500"
</code></pre> 
<p>启动成功后，可以看到以下输出：</p> 
<pre><code class="prism language-text">INFO[0000] Listening on :9100                            source="node_exporter.go:76"
</code></pre> 
<p>创建Systemd服务</p> 
<pre><code class="prism language-csharp">cat <span class="token operator">&gt;</span> <span class="token operator">/</span>etc<span class="token operator">/</span>systemd<span class="token operator">/</span>system<span class="token operator">/</span>node_exporter<span class="token punctuation">.</span>service <span class="token operator">&lt;&lt;</span> EOF
<span class="token punctuation">[</span>Unit<span class="token punctuation">]</span>
Description<span class="token operator">=</span><span class="token class-name">node_exporter</span>
Documentation<span class="token operator">=</span>https<span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span>prometheus<span class="token punctuation">.</span>io<span class="token operator">/</span>
After<span class="token operator">=</span>network<span class="token punctuation">.</span>target
<span class="token punctuation">[</span>Service<span class="token punctuation">]</span>
Type<span class="token operator">=</span><span class="token class-name">simple</span>
User<span class="token operator">=</span><span class="token class-name">prometheus</span>
ExecStart<span class="token operator">=</span><span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>node_exporter<span class="token operator">/</span><span class="token class-name">node_exporter</span>
Restart<span class="token operator">=</span><span class="token keyword">on</span><span class="token operator">-</span>failure
<span class="token punctuation">[</span>Install<span class="token punctuation">]</span>
WantedBy<span class="token operator">=</span>multi<span class="token operator">-</span>user<span class="token punctuation">.</span>target
EOF
</code></pre> 
<p>访问http://localhost:9100/ 可以看到以下页面：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/f5992f82fe4669af230dc680be8a0655.png" alt="img"></p> 
<p><strong>注意事项</strong></p> 
<p>一般情况下，node_exporter 都是直接运行在要收集指标的服务器上的，官方不推荐用 Docker 来运行 node_exporter。如果逼不得已一定要运行在 Docker 里，要特别注意，这是因为 Docker 的文件系统和网络都有自己的 namespace，收集的数据并不是宿主机真实的指标。可以使用一些变通的方法，比如运行 Docker 时加上下面这样的参数：</p> 
<pre><code>docker run -d \  
  --net="host" \  
  --pid="host" \  
  -v "/:/host:ro,rslave" \  
  quay.io/prometheus/node-exporter \  
  --path.rootfs /host  
</code></pre> 
<p>关于 node_exporter 的更多信息，可以参考 node_exporter 的文档 和 Prometheus 的官方指南 Monitoring Linux host metrics with the Node Exporter，另外，Julius Volz 的这篇文章 How To Install Prometheus using Docker on Ubuntu 14.04 也是很好的入门材料。</p> 
<h3><a id="4_Node_Exporter_272"></a><strong>4. 初始Node Exporter监控指标</strong></h3> 
<p>访问 http://localhost:9100/metrics ，可以看到当前node exporter获取到的当前主机的所有监控数据，如下所示：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/4dc2f54b43b7263ffcbbeb6ceadd60d6.png" alt="img"></p> 
<p>主机监控指标</p> 
<p>每一个监控指标之前都会有一段类似于如下形式的信息：</p> 
<pre><code class="prism language-text"># HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="idle"} 362812.7890625
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 3.0703125
</code></pre> 
<p>其中HELP用于解释当前指标的含义，TYPE则说明当前指标的数据类型。在上面的例子中node_cpu的注释表明当前指标是cpu0上idle进程占用CPU的总时间，CPU占用时间是一个只增不减的度量指标，从类型中也可以看出node_cpu的数据类型是计数器(counter)，与该指标的实际含义一致。又例如node_load1该指标反映了当前主机在最近一分钟以内的负载情况，系统的负载情况会随系统资源的使用而变化，因此node_load1反映的是当前状态，数据可能增加也可能减少，从注释中可以看出当前指标类型为仪表盘(gauge)，与指标反映的实际含义一致。</p> 
<p>除了这些以外，在当前页面中根据物理主机系统的不同，你还可能看到如下监控指标：</p> 
<ul><li>node_boot_time：系统启动时间</li><li>node_cpu：系统CPU使用量</li><li>nodedisk*：磁盘IO</li><li>nodefilesystem*：文件系统用量</li><li>node_load1：系统负载</li><li>nodememeory*：内存使用量</li><li>nodenetwork*：网络带宽</li><li>node_time：当前系统时间</li><li>go_*：node exporter中go相关指标</li><li>process_*：node exporter自身进程相关运行指标</li></ul> 
<h3><a id="5_Node_Exporter_310"></a><strong>5. 从Node Exporter收集监控数据</strong></h3> 
<p>为了能够让Prometheus Server能够从当前node exporter获取到监控数据，这里需要修改Prometheus配置文件。编辑prometheus.yml并在scrape_configs节点下添加以下内容:</p> 
<pre><code class="prism language-text">scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  # 采集node exporter监控数据
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
</code></pre> 
<p>重新启动Prometheus Server</p> 
<p>访问 http://localhost:9090 ，进入到Prometheus Server。如果输入“up”并且点击执行按钮以后，可以看到如下结果：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/ccc58267e1a549348e57b74e688e606b.png" alt="Expression Browser"></p> 
<p>如果Prometheus能够正常从node exporter获取数据，则会看到以下结果：</p> 
<pre><code class="prism language-text">up{instance="localhost:9090",job="prometheus"}    1
up{instance="localhost:9100",job="node"}    1
</code></pre> 
<p>其中“1”表示正常，反之“0”则为异常。</p> 
<h3><a id="6_PromQL_342"></a><strong>6. 使用PromQL查询监控数据</strong></h3> 
<p>Prometheus UI是Prometheus内置的一个可视化管理界面，通过Prometheus UI用户能够轻松的了解Prometheus当前的配置，监控任务运行状态等。 通过<code>Graph</code>面板，用户还能直接使用<code>PromQL</code>实时查询监控数据：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/dfc623ed46037ec6f12514dac1000686.png" alt="img"></p> 
<p>切换到<code>Graph</code>面板，用户可以使用PromQL表达式查询特定监控指标的监控数据。如下所示，查询主机负载变化情况，可以使用关键字<code>node_load1</code>可以查询出Prometheus采集到的主机负载的样本数据，这些样本数据按照时间先后顺序展示，形成了主机负载随时间变化的趋势图表：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/653fe84b9074e1587632f92bd071f183.png" alt="img"></p> 
<p>PromQL是Prometheus自定义的一套强大的数据查询语言，除了使用监控指标作为查询关键字以为，还内置了大量的函数，帮助用户进一步对时序数据进行处理。例如使用<code>rate()</code>函数，可以计算在单位时间内样本数据的变化情况即增长率，因此通过该函数我们可以近似的通过CPU使用时间计算CPU的利用率：</p> 
<pre><code class="prism language-text">rate(node_cpu[2m])
</code></pre> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/2eb4e148992b3ac43d91c3adc01b1f14.png" alt="img"></p> 
<p>这时如果要忽略是哪一个CPU的，只需要使用without表达式，将标签CPU去除后聚合数据即可：</p> 
<pre><code class="prism language-text">avg without(cpu) (rate(node_cpu[2m]))
</code></pre> 
<p>那如果需要计算系统CPU的总体使用率，通过排除系统闲置的CPU使用率即可获得:</p> 
<pre><code class="prism language-text"> - avg without(cpu) (rate(node_cpu{mode="idle"}[2m]))
</code></pre> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/7a3cd0b8274f84fb90a1bf8a90fc4363.png" alt="img"></p> 
<p>通过PromQL我们可以非常方便的对数据进行查询，过滤，以及聚合，计算等操作。通过这些丰富的表达书语句，监控指标不再是一个单独存在的个体，而是一个个能够表达出正式业务含义的语言。</p> 
<h3><a id="7__412"></a><strong>7. 监控数据可视化</strong></h3> 
<p>虽然 Prometheus 提供的 Web UI 也可以很好的查看不同指标的视图，但是这个功能非常简单，只适合用来调试。要实现一个强大的监控系统，还需要一个能定制展示不同指标的面板，能支持不同类型的展现方式（曲线图、饼状图、热点图、TopN 等），这就是仪表盘（Dashboard）功能。</p> 
<p>因此 Prometheus 开发了一套仪表盘系统 PromDash，不过很快这套系统就被废弃了，官方开始推荐使用 Grafana 来对 Prometheus 的指标数据进行可视化，这不仅是因为 Grafana 的功能非常强大，而且它和 Prometheus 可以完美的无缝融合。</p> 
<p>Grafana 是一个用于可视化大型测量数据的开源系统，它的功能非常强大，界面也非常漂亮，使用它可以创建自定义的控制面板，你可以在面板中配置要显示的数据和显示方式，它 支持很多不同的数据源，比如：Graphite、InfluxDB、OpenTSDB、Elasticsearch、Prometheus 等，而且它也 支持众多的插件。</p> 
<p>Prometheus UI提供了快速验证PromQL以及临时可视化支持的能力，而在大多数场景下引入监控系统通常还需要构建可以长期使用的监控数据可视化面板（Dashboard）。这时用户可以考虑使用第三方的可视化工具如Grafana，Grafana是一个开源的可视化平台，并且提供了对Prometheus的完整支持。</p> 
<pre><code class="prism language-text">docker run -d -p 3000:3000 grafana/grafana
</code></pre> 
<p>访问 http://localhost:3000 就可以进入到Grafana的界面中，默认情况下使用账户admin/admin进行登录。在Grafana首页中显示默认的使用向导，包括：安装、添加数据源、创建Dashboard、邀请成员、以及安装应用和插件等主要流程:</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/62e512c23a9e6a4f8d70e866437ce402.png" alt="img"></p> 
<p>这里将添加Prometheus作为默认的数据源，如下图所示，指定数据源类型为Prometheus并且设置Prometheus的访问地址即可，在配置正确的情况下点击“Add”按钮，会提示连接成功的信息：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/551f9bbe4a23f758b3167e5eecedabe2.png" alt="img"></p> 
<p>我们在这里依次填上：</p> 
<ul><li>Name: prometheus</li><li>Type: Prometheus</li><li>URL: http://localhost:9090</li><li>Access: Browser</li></ul> 
<p>要注意的是，这里的 Access 指的是 Grafana 访问数据源的方式，有 Browser 和 Proxy 两种方式。Browser 方式表示当用户访问 Grafana 面板时，浏览器直接通过 URL 访问数据源的；而 Proxy 方式表示浏览器先访问 Grafana 的某个代理接口（接口地址是 <code>/api/datasources/proxy/</code>），由 Grafana 的服务端来访问数据源的 URL，如果数据源是部署在内网，用户通过浏览器无法直接访问时，这种方式非常有用。</p> 
<p>配置好数据源，Grafana 会默认提供几个已经配置好的面板供你使用，如下图所示，默认提供了三个面板：Prometheus Stats、Prometheus 2.0 Stats 和 Grafana metrics。点击 Import 就可以导入并使用该面板。</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/cb16b1157597e9365bb2b6d761fc949b.png" alt="图片"></p> 
<p>我们导入 Prometheus 2.0 Stats 这个面板，可以看到下面这样的监控面板。如果你的公司有条件，可以申请个大显示器挂在墙上，将这个面板投影在大屏上，实时观察线上系统的状态，可以说是非常 cool 的。</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/4d446f13ec625511880ed128cae15179.png" alt="图片"></p> 
<p>在完成数据源的添加之后还可以在Grafana中创建我们可视化Dashboard了。Grafana提供了对PromQL的完整支持，如下所示，通过Grafana添加Dashboard并且为该Dashboard添加一个类型为“Graph”的面板。 并在该面板的“Metrics”选项下通过PromQL查询需要可视化的数据：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/4ee88fc296de07074a1159d710c58768.png" alt="img"></p> 
<p>点击界面中的保存选项，就创建了我们的第一个可视化Dashboard了。 当然作为开源软件，Grafana社区鼓励用户分享Dashboard通过<a href="https://grafana.com/dashboards" rel="nofollow">https://grafana.com/dashboards</a>网站，可以找到大量可直接使用的Dashboard：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/b30b998b510aa184f18e85d6cb500d8b.png" alt="img"></p> 
<p>Grafana中所有的Dashboard通过JSON进行共享，下载并且导入这些JSON文件，就可以直接使用这些已经定义好的Dashboard：<br> <img src="https://i-blog.csdnimg.cn/blog_migrate/cd7bf6235b6f3c4e1fc89d696072ddad.png" alt="img"><br> <img src="https://i-blog.csdnimg.cn/blog_migrate/14ec0648b2ddd36683115c1096116392.png" alt="在这里插入图片描述"></p> 
<h3><a id="8_475"></a>8.任务和实例</h3> 
<p>在上一小节中，通过在prometheus.yml配置文件中，添加如下配置。我们让Prometheus可以从node exporter暴露的服务中获取监控指标数据。</p> 
<pre><code>scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
</code></pre> 
<p>当我们需要采集不同的监控指标(例如：主机、MySQL、Nginx)时，我们只需要运行相应的监控采集程序，并且让Prometheus Server知道这些Exporter实例的访问地址。在Prometheus中，每一个暴露监控样本数据的HTTP服务称为一个实例。例如在当前主机上运行的node exporter可以被称为一个实例(Instance)。</p> 
<p>而一组用于相同采集目的的实例，或者同一个采集进程的多个副本则通过一个一个任务(Job)进行管理。</p> 
<pre><code>* job: node
    * instance 2: 1.2.3.4:9100
    * instance 4: 5.6.7.8:9100
</code></pre> 
<p>当前在每一个Job中主要使用了静态配置(static_configs)的方式定义监控目标。除了静态配置每一个Job的采集Instance地址以外，Prometheus还支持与DNS、Consul、E2C、Kubernetes等进行集成实现自动发现Instance实例，并从这些Instance上获取监控数据。</p> 
<p>除了通过使用“up”表达式查询当前所有Instance的状态以外，还可以通过Prometheus UI中的Targets页面查看当前所有的监控采集任务，以及各个任务下所有实例的状态:</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/9769369bb26ce0e535ce98621244f09b.png" alt="target列表以及状态"></p> 
<p>我们也可以访问http://192.168.33.10:9090/targets直接从Prometheus的UI中查看当前所有的任务以及每个任务对应的实例信息。</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/763ad85480fb519c67fc210a4d495923.png" alt="Targets状态"></p> 
<h3><a id="9Prometheus_519"></a>9.Prometheus核心组件</h3> 
<p>上一小节，通过部署Node Exporter我们成功的获取到了当前主机的资源使用情况。接下来我们将从Prometheus的架构角度详细介绍Prometheus生态中的各个组件。</p> 
<p>下图展示Prometheus的基本架构：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/4295af6aad94143e486d026d8b349ab7.png" alt="Prometheus架构"></p> 
<h4><a id="Prometheus_Server_527"></a>Prometheus Server</h4> 
<p>Prometheus Server是Prometheus组件中的核心部分，负责实现对监控数据的获取，存储以及查询。 Prometheus Server可以通过静态配置管理监控目标，也可以配合使用Service Discovery的方式动态管理监控目标，并从这些监控目标中获取数据。其次Prometheus Server需要对采集到的监控数据进行存储，Prometheus Server本身就是一个时序数据库，将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。最后Prometheus Server对外提供了自定义的PromQL语言，实现对数据的查询以及分析。</p> 
<p>Prometheus Server内置的Express Browser UI，通过这个UI可以直接通过PromQL实现数据的查询以及可视化。</p> 
<p>Prometheus Server的联邦集群能力可以使其从其他的Prometheus Server实例中获取数据，因此在大规模监控的情况下，可以通过联邦集群以及功能分区的方式对Prometheus Server进行扩展。</p> 
<h4><a id="Exporters_535"></a>Exporters</h4> 
<p>Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server，Prometheus Server通过访问该Exporter提供的Endpoint端点，即可获取到需要采集的监控数据。</p> 
<p>一般来说可以将Exporter分为2类：</p> 
<ul><li>直接采集：这一类Exporter直接内置了对Prometheus监控的支持，比如cAdvisor，Kubernetes，Etcd，Gokit等，都直接内置了用于向Prometheus暴露监控数据的端点。</li><li>间接采集：间接采集，原有监控目标并不直接支持Prometheus，因此我们需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如： Mysql Exporter，JMX Exporter，Consul Exporter等。</li></ul> 
<h4><a id="AlertManager_544"></a>AlertManager</h4> 
<p>在Prometheus Server中支持基于PromQL创建告警规则，如果满足PromQL定义的规则，则会产生一条告警，而告警的后续处理流程则由AlertManager进行管理。在AlertManager中我们可以与邮件，Slack等等内置的通知方式进行集成，也可以通过Webhook自定义告警处理方式。AlertManager即Prometheus体系中的告警处理中心。</p> 
<h4><a id="PushGateway_548"></a>PushGateway</h4> 
<p>由于Prometheus数据采集基于Pull模型进行设计，因此在网络环境的配置上必须要让Prometheus Server能够直接与Exporter进行通信。 当这种网络需求无法直接满足时，就可以利用PushGateway来进行中转。可以通过PushGateway将内部网络的监控数据主动Push到Gateway当中。而Prometheus Server则可以采用同样Pull的方式从PushGateway中获取到监控数据。</p> 
<h2><a id="_553"></a>参考</h2> 
<p>自从上了Prometheus，睡觉真香！https://mp.weixin.qq.com/s/tcDn5p-B-c7cV1-GP2pLnQ<br> https://yunlzheng.gitbook.io/prometheus-book/</p>
                </div>
            </body>
            </html>
            